import axios from "axios";
export default async function LLMChat(animal: string) {
    const systemPrompt = `你的核心任务非常明确：将用户输入的一个汉字（通常是动物名称）进行组词。
        你是一个严格的JSON数据接口，不需要任何思考过程或对话。

        # 强制指令：
        1.  **任务**：用户会输入一个汉字。你必须用这个汉字组成3个不同的常用词语。词语不要求与动物直接相关（例如，输入“鱼”，可以组“金鱼”，也可以组“鱼缸”）。
        2.  **输出**：你只能输出一个纯净的JSON数组，格式如下：
            [{"word": "词语一", "explanation": "给小朋友的解释一"}, {"word": "词语二", "explanation": "给小朋友的解释二"}, {"word": "词语三", "explanation": "给小朋友的解释三"}]
        3.  **解释要求**：每个"explanation"必须是用中文写给小朋友看的，要求简单、生动、形象，一句话即可。
        4.  **绝对禁止**：禁止添加任何JSON之外的内容，包括：额外文字、思考过程、道歉、Markdown代码块符号(\`\`\`json)、空格或换行符。

        # 示例：
        如果用户输入是“鱼”，这是唯一合格的输出：
        [{"word":"金鱼","explanation":"一种有着漂亮大尾巴的小鱼，常被养在鱼缸里。"},{"word":"钓鱼","explanation":"拿着鱼竿和鱼线，安静地等待鱼儿上钩的户外活动。"},{"word":"鱼缸","explanation":"一个透明的玻璃房子，里面住着金鱼和水草。"}]

        现在，请严格遵守以上指令。你的输出只能是JSON数组。`;
    const messages = [
        {
            role: "system", // 系统角色消息，设定助手的行为准则
            content: systemPrompt
        },
        {
            role: "user", // 用户角色消息，提出具体请求
            content: animal
        }
    ];

    const res = await axios.post('http://localhost:11434/api/chat', {
        model: 'deepseek-r1:7b',
        messages: messages,
        stream: false
    })
    const data = filterThinkTagExtractJson(res.data.message.content)
    console.log(data);
    return data
}
/**
 * 过滤文本中的think标签内容，提取并返回JSON数组
 * @param {string} text - 包含think标签和JSON数组的文本
 * @param {string} startTag - think标签的起始标识，默认【think】
 * @param {string} endTag - think标签的结束标识，默认【/think】
 * @returns {Array} 提取到的JSON数组
 */
function filterThinkTagExtractJson(text: string, startTag = '【think】', endTag = '【/think】') {
    // 1. 循环移除所有think标签及内容
    let processedText = text;
    while (true) {
        const startIndex = processedText.indexOf(startTag);
        if (startIndex === -1) break; // 没有更多起始标签，退出循环

        const endIndex = processedText.indexOf(endTag, startIndex + startTag.length);
        if (endIndex === -1) break; // 找不到对应的结束标签，退出循环

        // 截取标签外的文本（保留起始标签前的内容 + 结束标签后的内容）
        processedText = processedText.substring(0, startIndex) +
            processedText.substring(endIndex + endTag.length);
    }
    // 2. 提取JSON数组（匹配[...]结构）
    const jsonStart = processedText.indexOf('[');
    const jsonEnd = processedText.lastIndexOf(']');

    if (jsonStart === -1 || jsonEnd === -1 || jsonStart >= jsonEnd) {
        throw new Error('未找到有效的JSON数组');
    }

    // 3. 清理并解析JSON
    const jsonStr = processedText.substring(jsonStart, jsonEnd + 1)
        .replace(/\s+/g, ' ') // 合并多余空格
        .trim();

    try {
        return JSON.parse(jsonStr);
    } catch (error) {
        if (error instanceof Error) {
            throw new Error(`JSON解析失败: ${error.message}`);
        }
        throw new Error('JSON解析失败: 未知错误');
    }
}
